import { FILE_ICON_MAP } from '@/constant'

/**
 * 判断dom元素是否出现在指定元素内
 * @param source 需要判断的元素
 * @param target 目标元素
 */
export const checkDomIsInView = (source: Element, target: Element) => {
	const { top, bottom } = target.getBoundingClientRect()
	const { top: sourceTop, bottom: sourceBottom } = source.getBoundingClientRect()

	// console.log(source, sourceTop, 'target-bottom: ', bottom, 'sourceBottom', sourceBottom)
	return (sourceTop < bottom && sourceTop > 0) || (sourceBottom < bottom && sourceBottom > top) || (sourceTop <= top && sourceBottom >= bottom)
}

/**
 * 获取文件类型
 * @param file
 */
export const getFileType = (file: any) => {
	const startIndex = file.name.lastIndexOf('.')
	if (startIndex != -1) {
		return file.name.substring(startIndex + 1, file.name.length).toLowerCase()
	} else {
		return ''
	}
}

/**
 *根据文件名获取文件图标
 *
 */
export const getFileIcon = (file: any) => {
	for (const key in FILE_ICON_MAP) {
		const item = FILE_ICON_MAP[key]
		if (item.regex && item.regex.test((file.name || file.fileOriginName).toLowerCase())) {
			return item.icon
		}
	}

	return FILE_ICON_MAP.default.icon
}

/**
 * 获取金额显示符号
 * @param o
 */
export const amountSymbol = (o: any) => {
	return o.feeDirection == 1 ? '+' : '-'
}

/**
 * 获取金额显示颜色
 * @param o
 */
export const amountColor = (o: any) => {
	return o.feeDirection == 1 ? 'primary' : 'danger'
}

/**
 * 判断当前运行是否为云丁环境
 */
export const isLockinEnv = () => {
	return true
}

/**
 * 判断当前运行是否为寓信环境
 */
export const isYuXin = () => {
	// @ts-ignore
	const mode = import.meta.env.MODE || ''
	return mode.includes('yxpms')
}

/**
 * 判断当前运行是否为开发环境
 */
export const isDevEnv = () => {
	// @ts-ignore
	return import.meta.env.DEV
}

/**
 * vite.config.ts中判断当前环境是否为生产环境
 * @param mode 当前运行的.env配置文件mode，例如：.env.yuxin.prod的mode为yuxin.prod
 */
export const isProdEnv = (mode: string) => {
	return ['prod', 'cyzf', 'czsk', 'production'].some(env => mode.includes(env))
}
type Func = (...args: any[]) => void;
export const debounce = (fn: Func, wait: number): Func => {
	let timeout: NodeJS.Timeout | null

	// 返回一个新的函数
	return function (this: any, ...args: any[]): void {
		if (timeout) {
			clearTimeout(timeout)
		}
		// 设置超时，在wait毫秒后执行fn
		timeout = setTimeout(() => {
			fn.apply(this, args)
		}, wait)
	}
}